package com.itzhouwei.rpc.codec;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

/**
 * @description: RpcEncoder 编码器
 * @author：zw，微信：yingshengzw
 * @date: 2023/10/28 20:24
 * @Copyright： 公众号：搬砖暗夜码农 | 博客：https://itzhouwei.com - 沉淀、分享、成长，让自己和他人都能有所收获！
 */
public class RpcEncoder extends MessageToByteEncoder<Object> {

    private Class<?> genericClass;

    public RpcEncoder(Class<?> genericClass){
        this.genericClass=genericClass;
    }

    /****
     *  编码器要做的事情
     *  1.把对应的Java对象进行编码
     *  2.之后把内容填充到buffer 中去
     *  3.写出到server端
     * @param ctx
     * @param msg
     * @param out
     * @throws Exception
     */
    @Override
    protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception {
        if (genericClass.isInstance(msg)){
            byte[] data = Serialization.serialize(msg);
            //消息体  分为 头(数据包长度) 和体 (数据包内容)
            out.writeInt(data.length);
            out.writeBytes(data);
        }else {
            //TODO 抛出异常
        }
    }
}
